/*
 * Ajax 和 Comet
 */
//XMLHttpRequest 对象
//支持IE7即更早的版本
function createXHR() {
	if (typeof XMLHttpRequest != "undefined") {
		return new XMLHttpRequest();
	} else if (typeof ActiveXObject != "undefined") {
		//适用于 IE7 之前的版本
		if (typeof arguments.callee.activeXString != "string") {
			var versions = ["MSXML2.XMLHttp.6.0", "MSXML.XMLHttp.3.0", "MSXMLHttp"],
				i, len;
			for (i = 0, len = versions.length; i < len; i++) {
				try {
					new ActiveXObject(versions[i]);
					arguments.callee.activeXString = versions[i];
					break;
				} catch (ex) {
					//
				}
			}
		}
		return new ActiveXobject(arguments.callee.activeXString);
	} else {
		throw new Error("No XHR object available.")
	}
}
//XHR 的用法
xhr.open("get", "example.php", false); //只是启动一个请求以备发送
xhr.send("post", "example.php", false); //
xhr.send(null); //
//responseText：作为响应主体被返回的文档
//responseXML：如何响应的内容类型是 "text/xml" 或 "appliction/xml"，这个属性中将保存包含着响应数据的 XML DOM 文档
//status：响应的 http 状态
//statusText：http 状态的说明
if ((xhr.status >= 200 && xhr.status < 300) || xhr == 304) {
	alert(xhr.responseText);
} else {
	alert("Request was unsuccessful:" + xhr.status);
}
//readyState 该属性表示请求/响应过程的当前活动阶段
// 0：未初始化。尚未调用 open()
// 1：启动。已经调用 open() 方法，但尚未调用 send() 方法
// 2：发送。已经调用 send() 方法，但尚未接收到响应
// 3：接收。已经接收到部分响应数据
// 4：完成。已经接收到全部响应数据，而且已经可以在客户端使用了
var xhr = createXHR();
xhr.onreadystatechange = function() {
	if (xhr.readyState == 4) {
		if ((xhr.status >= 200 && xhr.status < 300) || xhr == 304) {
			alert(xhr.responseText);
		} else {
			alert("Request was unsuccessful:" + xhr.status);
		}
	}
}
xhr.open("get","url",true);//true 为异步请求，false 为同步请求
//xhr.setRequestHeader("","");
xhr.send(null);
xhr.abort();       //取消异步请求
//http 头部信息
//setRequestHeader() 方法可以设置自定义的请求头部信息，必须放在 open() 方法和 send() 方法的中间
//getResponseHeader() 取得相应的头部信息
//getAllResponseHeaders() 取得一个包含所有头部信息的长字符串
//
//get 请求
//post 请求

//XMLHttpRequest 2级
//FromData 对象：append("键","值")；
//超时设定：timeout 属性，ontimeout() 事件
//overrideMimeType() 方法

//进度事件
// loadstart：在接收到响应数据的第一个字节时触发
// progress：在接收响应期间持续不断地触发
// error：在请求发生错误时触发
// abort：在因为调用 abort() 方法而终止链接时触发
// load：在接收到完整的响应数据时触发
// loadend：在通信完成或者触发 error 、abort 、load 事件后触发

//跨资源共享（ CORS ）
//IE 对 CORS 的实现
// cookie 不会随请求发送，也不会随响应返回
// 只能设置请求头部信息中的 Content-Type 字段
// 不能访问响应头部信息
// 只支持 GET 和 POST 请求
//
//
//
//

/*
 * JSONP
*/
//根据指定一个URL发送一个jsonp请求
//然后把解析得到的响应数据传送给回调函数
//在URL中添加一个名为jsonp的查询参数，永远指定给请求的回调函数的名称
function getJSONP(url,callback){
    //为本次请求创建一个唯一的回调函数名称
    var cbnum="cb"+getJSONP.counter++;//每次请求自增计数器
    var cbname="getJSON."+cbnum;//做完JSONP函数的属性

    //将回调函数名称以表单编码的形势添加到URL的查询部分中
    //使用jsonp作为参数名，一些支持JSONP的服务
    //可能使用其他的参数名，比如callback
    if (url.indexOf("?")=== -1) {//URL没有查询部分
    	url+="?jsonp="+cbname;//作为查询部分添加参数
    }else{
        url+="&jsonp="+cbname;//作为新的参数添加它
    }

    //创建scrip元素用于发送请求
    var script=document.createElement("script");

    //定义将被脚本执行的回调函数
    getJSONP[cbnum]=function(response){
        try{
            callback(response);//处理响应数据
        }catch(error){
           console.log("error:"+error.message);
        }
        finally{//即使回调函数或响应抛出错误
           delete getJSONP[cbnum];//删除函数
           script.parentNode.removeChild(script);//移除script元素
        }
    }

    //立刻触发http请求
    script.src=url; //设置脚本的URL
    document.parentNode.removeChild(script);//移除script元素
}
getJSONP.counter=0;//用于创建唯一回调函数名称的计数器



//未完待续